package administracion;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import dao.CajeroDAO;
import dao.FacturaDAO;
import dao.MesaDAO;
import dao.PlatoDAO;
import dto.CajeroDTO;
import dto.ComandaDTO;
import dto.FacturaDTO;
import dto.ItemComandaDTO;
import entity.Cajero;
import entity.Factura;
import entity.ItemFactura;
import entity.Liquidacion;
import entity.Mesa;


public class FacturaManager {

	private static FacturaManager instancia;
	private FacturaDAO dao = FacturaDAO.getInstancia();
		
	public FacturaManager() {
		super();
	}
		
	public static FacturaManager getInstancia(){
		if(instancia == null)
			instancia = new FacturaManager();
		return instancia;
	}
	public void altaFactura(ComandaDTO c, CajeroDTO ca) throws RemoteException {
		Cajero caj =CajeroDAO.getInstancia().buscarCajeroCodigo(ca.getLegajo());
		Mesa mes= MesaDAO.getInstancia().buscarMesa(c.getMesa().getNumero());
		Factura f=new Factura();
		f.setEmpleado(caj);
		f.setMesa(mes);
		
		//genero un item factura por cada item comanda.
		List <ItemFactura> item= new ArrayList<ItemFactura>();
		for(ItemComandaDTO i: c.getItems()){
			//Si el plato fue entregado paso a la factura.
			if(i.getEstado()=="entregado"){
				ItemFactura it = new ItemFactura();
				it.setCantidad(i.getCantidad());
				it.setProducto(PlatoDAO.getInstancia().buscarPlatoCodigo(i.getPlato().getCodigo()));
				it.setPrecio(PlatoDAO.getInstancia().buscarPlatoCodigo(i.getPlato().getCodigo()).getPrecio());	
				item.add(it);
			}
		}
		f.setItems(item);
		//Falta calcular la comision del Mozo? o la calculo cuando cierro
	}
	
	
	public void actualizaFactura(ComandaDTO c, int numero ) throws RemoteException {
		Factura f=FacturaDAO.getInstancia().buscarFactura(numero);
		
		List <ItemFactura> item= new ArrayList<ItemFactura>();
		
		
		for(ItemComandaDTO i: c.getItems()){
			//Si el plato fue entregado paso a la factura.
			if(i.getEstado()=="entregado"){
				ItemFactura it = new ItemFactura();
				it.setCantidad(i.getCantidad());
				it.setProducto(PlatoDAO.getInstancia().buscarPlatoCodigo(i.getPlato().getCodigo()));
				it.setPrecio(PlatoDAO.getInstancia().buscarPlatoCodigo(i.getPlato().getCodigo()).getPrecio());
				item.add(it);
			}	
		}
		f.setItems(item);
		//Falta calcular la comision del Mozo? o la calculo cuando cierro
		//hay que persistir la factura?
		
	}
	
	public void confirmarFactura(FacturaDTO factura){
		Factura f =FacturaDAO.getInstancia().buscarFactura(factura.getNumero());
		float total=0; float totalComision=0;
		for(ItemFactura i: f.getItems()){
			float parcial=0;
			parcial=i.getCantidad()*i.getPrecio();
			total=total+parcial;
			totalComision=totalComision+(i.getProducto().getComision()*parcial);
		}
		f.setTotal(total);
		dao.updateFactura(f);
		//falta calcular la comision del mozo?
		MozoManager.getInstancia().adicionarComision(totalComision);
		
	}
	
	public FacturaDTO buscarFacturaId(int numero) {
		Factura f =FacturaDAO.getInstancia().buscarFactura(numero);
		return f.toDTO();
	}

}
